package appvideo.logica;

import appvideo.persistencia.PersistenciaAlquiler;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

public class Alquiler {
    private int id;
    private double coste;
    private Promociones promocion;
    private Usuario usuario;//Quien lo realiza
    private List<ProductoAlquilado> productosAlquilados;
    private Socio socio;
    

    public Alquiler(double coste, Usuario usuario, List<ProductoAlquilado> productosAlquilados, Socio socio, Promociones p) {
        this.coste = coste;
        this.usuario = usuario;
        this.productosAlquilados = productosAlquilados;
        this.socio = socio;
        this.promocion = p;
    }
    
    public Alquiler(int id,double coste, Usuario usuario, List<ProductoAlquilado> productosAlquilados, Socio socio, Promociones p) {
        this.id = id;
        this.coste = coste;
        this.usuario = usuario;
        this.productosAlquilados = productosAlquilados;
        this.socio = socio;
        this.promocion = p;
    }

    public int getId() {
        return id;
    }
    
    public double getCoste() {
        return coste;
    }

    public void setCoste(float coste) {
        this.coste = coste;
    }

    public List<ProductoAlquilado> getProductosAlquilados() {
        return productosAlquilados;
    }

    public void setProductosAlquilados(List<ProductoAlquilado> productosAlquilados) {
        this.productosAlquilados = productosAlquilados;
    }

    public Socio getSocio() {
        return socio;
    }

    public void setSocio(Socio socio) {
        this.socio = socio;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }
    public Promociones getPromocion() {
        return promocion;
    }

    public void setPromocion(Promociones promocion) {
        this.promocion = promocion;
    }
    public static List<Alquiler> getAlquileres(int opcion){
        return PersistenciaAlquiler.getAlquileres(opcion);
    }
    
    public boolean altaAlquiler() throws Exception{
        boolean ret=false;
        ret = PersistenciaAlquiler.altaAlquiler(this);
        double costeFinalAlquiler=0.00;
         String descripcion ="Alquiler:\t";
        if(ret==true){
            System.out.println("Alquiler realizado");            
            List<ProductoAlquilado> productos = this.getProductosAlquilados();
            double totalsinpromocion=0.00;
            
            Iterator itp = productos.iterator();
            while (itp.hasNext()) {
                ProductoAlquilado prv = (ProductoAlquilado) itp.next();
                totalsinpromocion=totalsinpromocion+prv.getProducto().getTarifa().getPrecio();
            } 
            
            Iterator its = productos.iterator();
            while (its.hasNext()) {
                ProductoAlquilado prv = (ProductoAlquilado) its.next();
                descripcion =descripcion + "\n"+prv.getProducto().getNombre()+ " "+prv.getProducto().getTarifa().getPrecio()+" €";
            }
            if(this.promocion==null){
               costeFinalAlquiler = totalsinpromocion;  
            }else{
                costeFinalAlquiler = this.coste;
                descripcion = descripcion +"\nPromocion "+this.promocion.getNombre()+" aplicada";
            }
            Caja caja = new Caja(costeFinalAlquiler,this.getSocio().getId(),descripcion);
            caja.registraNuevoUso();
        }
        else
            System.out.println("Alquiler no realizado");
        return ret;
    } 
    
    public boolean anulaAlquiler(){
        
         List<ProductoAlquilado> productos = this.getProductosAlquilados();
            Iterator itp = productos.iterator();
            if(itp.hasNext()) {
                ProductoAlquilado prv = (ProductoAlquilado) itp.next();
                Caja caja = new Caja(this.getSocio().getId(),prv.getfAlquiler());
                caja.anulaRegistroCaja();
            }
            
        return PersistenciaAlquiler.anularAlquiler(this);
        
    }
    //Busca alquiler por dniSocio
    public static Alquiler buscaAlquiler(String dniSocio){
        Alquiler a = null;
        //Implementa el tema de la base de datos
        a = PersistenciaAlquiler.buscaAlquiler(dniSocio);
        if(a==null){
            System.out.println("\nNo hay alquiler activo para ese socio");
        }else
            System.out.println("\nAlquiler encontrado");
        
        return a;
    }
    
    public boolean insertaNuevoProductoAlquilado(ProductoAlquilado pAlq){
        boolean ret=false;
        ret = PersistenciaAlquiler.insertarNuevoProductoAlquilado(pAlq,this.getId()); 
        if(ret=true){
            Caja caja = new Caja(pAlq.getProducto().getTarifa().getPrecio(),this.getSocio().getId(),"Alquiler: "+pAlq.getProducto().getNombre());
            caja.registraNuevoUso();
            System.out.println("Producto Alquilado");
        }else{
            System.out.println("Producto no Alquilado");
        }
        return ret;
    }
    
    public boolean devolucionProductosCompleta(){
        boolean ret=false;
        
        Iterator it = this.getProductosAlquilados().iterator();
        while(it.hasNext()){
            ProductoAlquilado pa = (ProductoAlquilado)it.next();
            pa.setfEntrega(new Date());
            
            if(it.hasNext()){
                PersistenciaAlquiler.devolucionProductoAlquilado(pa, this.id, false);
            }else{
                //Para el ultimo producto a devolver ponemos el 3º parametro a true
                //Indicando que es el ultimo producto del alquiler
                PersistenciaAlquiler.devolucionProductoAlquilado(pa, this.id, true);
                ret=true;
            }            
        }
       return ret;
    }
    
    public boolean devolucionProducto(int codigo,String tipo,int idsocio){
        boolean ret=false;
        Iterator it = productosAlquilados.iterator();
        while(it.hasNext()){
            ProductoAlquilado pa = (ProductoAlquilado)it.next();
            if(pa.getProducto().getCodigo()==codigo){
                if(tipo.equals("v") && pa.getProducto() instanceof Videojuego){
                    
                    Recargo recargo=new Recargo();
                    double rec = recargo.compruebaRecargoIndividual(pa);
                    if(rec>0){
                        //en caso de que conlleve recargo se notifica y se registra en la caja
                        System.out.println("El alquiler tiene un recargo de: "+rec+"€");
                        Caja caja = new Caja(rec,idsocio,"Recargo");
                        caja.registraNuevoUso();
                    }
                    else{
                        System.out.println("El alquiler no conlleva recargo");
                    }
                    pa.setfEntrega(new Date());        
                    it.remove();
                    //Con la siguiente linea devolvemos un producto alquilado
                    //y controlamos si se trata del ultimo producto que quedaba por devolver
                    ret = PersistenciaAlquiler.devolucionProductoAlquilado(pa,this.getId(),productosAlquilados.isEmpty());
                }else if(tipo.equals("p") && pa.getProducto() instanceof Pelicula){
                 
                    Recargo recargo=new Recargo();
                    double rec = recargo.compruebaRecargoIndividual(pa);//aki me kedoooo
                    if(rec>0){
                        //en caso de que conlleve recargo se notifica y se registra en la caja
                        System.out.println("El alquiler tiene un recargo de: "+rec+"€");
                        Caja caja = new Caja(rec,idsocio,"Recargo");
                        caja.registraNuevoUso();
                    }
                    else{
                        System.out.println("El alquiler no conlleva recargo");
                    }
                    pa.setfEntrega(new Date());
                    it.remove();
                    ret = PersistenciaAlquiler.devolucionProductoAlquilado(pa,this.getId(),productosAlquilados.isEmpty());
                }
            }
        }
        return ret;
    }
    
    public boolean prolongarProductoAlquilado(ProductoAlquilado pa){
        boolean ret=false;
        //ProductoAlquilado 
        ret = PersistenciaAlquiler.prolongarProductoAlquilado(pa);        
        //GENERAR PAGO DEL PRODUCTO PROLONGADO
        Caja caja = new Caja(pa.getProducto().getTarifa().getPrecio(),this.getSocio().getId(),"Prol.Alquiler: "+pa.getProducto().getNombre());
        caja.registraNuevoUso();
        
        return ret;
    }
    
    @Override
    public String toString(){
        String ret="";
        ret = "\n\nDatos Alquiler:\t\t"+id+"\t\tCoste(descuento incluido si lo hubiera): "+coste+"\n"
             +"Datos Socio:\t\t"+getSocio().getId()+"\t\t"+getSocio().getNombre()+" "+getSocio().getApellidos()+"\t"+this.getSocio().getDni()+"\n"
             +"Datos Supervisor:\t\t\t"+getUsuario().getNombre()+"\n";
        if(getPromocion()==null){
            ret = ret + "Promocion Elegida:\t\t\tNinguna";
        }else{
            ret = ret + "Promocion Elegida:\t\t\t"+getPromocion().getNombre();
        }
        ret = ret + visualizaProductosAlquiler(this.productosAlquilados);
        return ret;
    }
    
    public String visualizaProductosAlquiler(List<ProductoAlquilado> productosAlquilados){
        SimpleDateFormat dt = new SimpleDateFormat("yyyy-MM-dd");
        String ret="\n***************************PRODUCTOS DEL ALQUILER**************************************************************";
        Iterator it = getProductosAlquilados().iterator();
        while(it.hasNext()){
            ProductoAlquilado pa = (ProductoAlquilado)it.next();
            ret = ret + pa.getProducto().toString();
            if(pa.getProducto() instanceof Pelicula){
                ret = ret + "\tPRODUCTO: PELICULA";
            }else if(pa.getProducto() instanceof Videojuego){
                ret = ret + "\tPRODUCTO: VIDEOJUEGO";
            }
            ret = ret + "\nFecha Alquiler: "+dt.format(pa.getfAlquiler())+"\tFecha Devolucion: "+dt.format(pa.getfFin());
            ret = ret +"\n--------------------------------------------------------------------------------";
        }
        return ret+"\n****************************************************************************************************************";
    }
    
}
